// 函数对象的应用
// Created by Administrator on 2025/6/25.
// 可以存储、调用和复制任何可以调用的对象

#include <functional>
#include <iostream>
using namespace std;

void print() {
    cout << "hello world" << endl;
}

int add(const int &num1, const int &num2) {
    return num1 + num2;
}

void vectorSortFunc() {
    vector<int> vec = {1, 5, 3, 2, 4};
    sort(vec.begin(), vec.end(), less<int>());

    for (int i: vec) {
        cout << i << "\t";
    }
    cout << endl;
}

/**
 * 通过函数对象传参
 * @param f1
 * @param name
 */
void printTxt(const function<void()>& f1,const string& name) {
    f1();
    cout << "我的名称叫：" << name << endl;
}

int main(int argc, char *argv[]) {
    // 函数绑定器
    const function<void()> f1 = print;
    f1();

    // lambda
    const function<void()> f2 = []() {
        cout << "这是lambda的写法" << endl;
    };
    f2();

    // 函数绑定器（传递参数）
    auto value1 = bind(add, 1, 2);
    cout << value1() << endl;

    // 函数绑定器（参数占位符） placeholders::_1
    auto value2 = bind(add, 5, placeholders::_1);
    cout << value2(10) << endl;


    printTxt(f1,"张三");

    /**
     * 通过使用函数对象，我们可以将行为和动作作为参数进行传递，或者将其存储在容器中，并稍后调用。
     */
}
